package util;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @配置评分细则
 * Config类用于读取配置文件，只有一个静态方法，在主函数中提供了使用样例
 * 
 * 
 */
public class Config {
    //传入评分细则文件，建立一个key-value一一对应的配置命令映射
    public static Map<String, List<String>> getConfig(String file) {
        //将传入的列表集文件读入字符串列表
        List<String> lineList = IO.fileToStringList(file, StandardCharsets.UTF_8);
        //用哈希算法来创建一个存储配置命令的存取键对象
            //key:[String] value:[List<String>]
            //其中，value所对应的List<String>是前面执行IO.fileToStringList()获得的返回值
        Map<String, List<String>> configMap = new HashMap<>();
        //写入一个名为default的“键”
        String key = "default";
        //向 Map 集合中添加键-值对吗，这里填入了一个List集合
        configMap.put(key, new ArrayList<>());
        //遍历lineList中的每个元素
        for (String line : lineList) {
            //返回删除头尾空白符的字符串
            line = line.trim(); 
            //如果被检历的该行是空行，那么跳出当前循环直接开始下一次循环
            if (line.isEmpty()) {
                continue;
            }
            //如果当前行以指定后缀“:”结束，就用“ ” 来替换“:”
            if (line.endsWith(":")) {
                line = line.replace(":", "");
                //判断当前键是否包含指定值的映射，即判断可以、是否包含line字符串
                if (!configMap.containsKey(line)) {
                    //如果当前line键没有指定的映射值，那么就将字符串集合lineList赋为它的值
                    configMap.put(line, new ArrayList<>());
                }
                //如果存在line键包含的映射值，则将map中的每个key键指定为line
                key = line;
            }
            //排除掉以上所有情况后，返回在该配置命令中key键指定的值，在该键下存入指定的line字符串
            else {
                configMap.get(key).add(line);
            }
        }
        //将该配置命令的映射集返回
        return configMap;
    }

    public static void main(String[] args) {
        // 通过测试
        // javac -cp src/ -d dist/ src/util/Config.java
        // java -cp dist/ util.Config config.txt
        String file = "config.txt";
        Map<String, List<String>> configMap = Config.getConfig(file);
        System.out.println(configMap);
    }
}
